package com.itheima.edu.info.manager.controller;


import com.itheima.edu.info.manager.domain.Student;
import com.itheima.edu.info.manager.service.StudentService;

import java.util.Scanner;


//客服类
public abstract class BaseStudentController {
    private StudentService service = new StudentService();
    public Scanner sc = new Scanner(System.in);

    //学生管理系统菜单展示功能
    public final void start() {
        while (true) {
            //展示二级功能菜单
            System.out.println("--------欢迎来到学生管理系统--------");
            System.out.println("1 添加学生");
            System.out.println("2 删除学生");
            System.out.println("3 修改学生");
            System.out.println("4 查看学生");
            System.out.println("5 退出");
            System.out.println("请输入您的选择:");
            int choice = sc.nextInt();

            //基于用户录入的操作指令进行功能的路由
            switch (choice) {
                case 1:
                    addStudent();
                    break;
                case 2:
                    deleteStudent();
                    break;
                case 3:
                    updateStudent();
                    break;
                case 4:
                    findAllStudent();
                    break;
                case 5:
                    System.out.println("感谢您使用学生管理系统,再会~");
                    //仅仅退出当前方法
                    return;
                default:
                    System.out.println("输入有误!");
                    break;
            }

        }
    }
    //客服类中的修改学生功能
    public final void updateStudent() {
        //判断一下当前系统是否有数据,如果没有数据,直接给个提示return当前方法
        //指挥业务员把系统中的数据全部查到
        Student[] stus = service.findAllStudent();
        //有数据,就展示数据
        if (stus == null) {
            //没有数据,提示当前系统无数据,请添加后重试!
            System.out.println("当前系统无数据,请添加后重试!");
            return;
        }
        //1. 拿到要修改的学生学号
        System.out.println("请输入要修改的学生学号:");
        String updateId = inputStudentId(true);

        //2. 拿到要修改的学生的新信息
        //3. 封装新的学生对象
        Student newStu = inputStudentInfo(updateId);

        //4. 指挥业务员进行修改学生的业务处理
        service.updateStudent(updateId, newStu);

        //5. 给出提示信息
        System.out.println("修改成功!");
    }
    //客服类中的删除学生功能
    public final void deleteStudent() {
        //1. 指挥业务员把系统中的数据全部查到
        Student[] stus = service.findAllStudent();
        //有数据,就展示数据
        if (stus == null) {
            //没有数据,提示当前系统无数据,请添加后重试!
            System.out.println("当前系统无数据,请添加后重试!");
            return;
        }
        //1. 让用户输入要删除的学生学号
        System.out.println("请输入要删除的学生学号:");
        String deleteId = sc.next();

        //2. 指挥业务员去干删除业务
        boolean result = service.deleteStudent(deleteId);

        //3. 给出删除结果提示信息
        if (result) {
            System.out.println("删除成功");
        } else {
            System.out.println("删除失败,请确保要删除的学生学号存在!");
        }

    }
    //客服类中的查看学生功能
    public final void findAllStudent() {
        //1. 指挥业务员把系统中的数据全部查到
        Student[] stus = service.findAllStudent();
        //有数据,就展示数据
        if (stus == null) {
            //没有数据,提示当前系统无数据,请添加后重试!
            System.out.println("当前系统无数据,请添加后重试!");
        } else {
            //2. 遍历系统数据,将每一个学生信息打印到控制台,展示给用户
            //2.1 展示数据之前,先展示表头数据
            System.out.println("学号\t\t姓名\t年龄\t生日");
            //2.2 再来遍历容器,展示学生信息
            for (int i = 0; i < stus.length; i++) {
                //拿到每一个学生信息
                Student stu = stus[i];
                //输出当前学生信息
                if (stu != null) {
                    System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t\t" + stu.getBirthday());
                }
            }
        }
    }
    //客服类中的添加学生功能
    public final void addStudent() {
        //1. 让用户录入要添加的学生信息
        System.out.println("请输入要添加的学生学号:");
        String id = inputStudentId(false);

        //2. 调用方法键盘录入学生信息,封装学生对象
        Student stu = this.inputStudentInfo(id);

        //3. 指挥业务员进行添加学生的业务处理
        boolean result = service.addStudent(stu);

        //4. 根据业务员返回的结果组织对应的展示信息给用户
        if (result) {
            System.out.println("添加成功!");
        } else {
            System.out.println("添加失败!");
        }


    }

    //抽取一个方法,专门来做键盘录入学号并返回一个可用学号
    //flag: 方法的开关: true: 表示希望得到一个存在的学号. false:表示希望得到一个不存在的学号
    public final String inputStudentId(boolean flag){
        String id;
        while (true) {
            id = sc.next();
            //指挥业务员校验本次录入的学号是否存在
            boolean exists = service.isExists(id);
            //当且仅当exists的值和flag的值相等时,才会结束循环,停止输入学号
            //exists的值和flag的值相等则表示取到了调用者期望的学号
            if (exists == flag) {
                break;
            } else {
                System.out.println("当前学号不可用,请重新录入");
            }
        }
        //返回学号
        return id;
    }

    //抽取一个方法, 用于键盘录入学生信息,封装学生对象并返回
    public abstract Student inputStudentInfo(String id);

}
